/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#ifndef SQUAREWAVEFORM_H
#define SQUAREWAVEFORM_H

#include "WaveformBase.h"

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

/**
    Klasa reprezentująca sygnał prostokątny.

    Jest jednym z rodzajów typu WaveformBase. Implementuje metodę getNextValue
    zwracając aktualną wartość sygnału prostokątnego. Możliwa jest modyfikacja
    takich parametrów jak amplituda, okres, przesunięcie w pionie i w fazie,
    oraz współczynnik wypełnienia.

    Matematyczny opis fali prostokątnej jest następujący:
    \f{eqnarray*}{ r = \frac{i}{T}+\varphi - \mbox{floor}\left(\frac{i}{T}+\varphi\right) \\
                   y(i) = A - A_{gain}, \mbox{dla } r < r_{duty} \\
                   y(i) = A + A_{gain}, \mbox{dla } r \geq r_{duty} \f}
*/
class SquareWaveform : public WaveformBase
{
public:
    explicit SquareWaveform(SimInterface::ISimulator& sim,
                            double amplitude = 1, double period = 25,
                            double offset = 0, double phase = 0, double duty = 0.5);

    double getNextValue();

    void setDuty(double duty) { m_duty = duty; }
    double getDuty() const { return m_duty; }

    virtual bool setParameter(const std::string& param, const std::string& value) throw(std::logic_error);
    virtual std::string getParameter(const std::string& param) const throw(std::logic_error);

protected:
    SimFile::ConfigWriter& dumpSpecificPar(SimFile::ConfigWriter& o) const;

private:
    static const std::string CONF_AMPLITUDE;
    static const std::string CONF_DUTY;

    double m_duty;
};

}   // SimEngine namespace
}   // RafMat namespace

#endif // SQUAREWAVEFORM_H
